当前位置:flash课件吧→教育→教育教学栏目

www.luotao2008.cn视频网校,仅需要一个耳机+QQ远程即可完成所有教学任务。

题 目:自定义的灵活方便的按键事件侦听器

标题名字很长,不过为了描述清楚具体是怎么回事.还是得看下边的文字.

要实现的目标很简单,无非是把惯用的按键事件做一个封装.让注册和取消注册变得EASY.

一般来说,捕获按键事件都是由主场景来做捕获,再把对应的事件映射到需要用到这一事件的对象上.
比如说,一个名叫man的MC为主场景STAGE注册了一个按键事件,响应来自主场景上的按键事件,并做需要做的事情.代码类似这样.
....
this.root.stage.addEventListener(KeyboardEvent.KEY_DOWN,keydown)
....
function keydown(evt:KeyboardEvent)
{
//一些操作
}

这段代码是定义在MAN这个类中的.

现在我们要做的就是一个封装.让我们能把上边这个代码所要做的内容用比较简洁的方式呈现.
目标1:把对应按键与对应的方法做绑定,即注册事件侦听
目标2:取消事件侦听

 

于是我写了一个KKeyboard类

package KanClasses
{
import flash.display.InteractiveObject;
import flash.events.KeyboardEvent;
public final class KKeyboard
{
private var _listener:InteractiveObject;
private var _listeners:Object={};//这个OBJECT用来记录各个已经注册过的函数的,在取消侦听时会用到
function KKeyboard(listener:InteractiveObject)
{
//定义listener对象,也就是函数存放的可显示对象,这里用的类型是InteractiveObject类型,以便兼容多种对象
this._listener=listener;
}
public function registerKeyDownEvent(keycode:uint,funcname:String,...args):void
{
//为可显对应的主场景对象注册按键事件,事件所要做的内容指向由makeFunction返回的函数对象
this._listener.root.stage.addEventListener(KeyboardEvent.KEY_DOWN,makeFunction(keycode,funcname,args))
}
public function unregisterKeyDownEvent(keycode:uint,funcname:String,...args):void
{
//取消按键注册事件.
this._listener.root.stage.removeEventListener(KeyboardEvent.KEY_DOWN,makeFunction(keycode,funcname,args))
}
//上边两个是按下时的事件注册,下边是弹起时的.
public function registerKeyUpEvent(keycode:uint,funcname:String,...args):void
{
this._listener.root.stage.addEventListener(KeyboardEvent.KEY_UP,makeFunction(keycode,funcname,args))
}
public function registerKeyUpEvent(keycode:uint,funcname:String,...args):void
{
this._listener.root.stage.removeEventListener(KeyboardEvent.KEY_UP,makeFunction(keycode,funcname,args))
}

function makeFunction(key:uint,funcname:String,args:Array):Function
{
//这个方法的内容就是把具体针对按键事件要做的事进行内包装.加上了具体的键的判断.
//同时如果有重复的方法,就使用已经注册过的方法.因为一般来说,实例化这个类的对象都是和某一个可显示对象作一一对应的,所以,显示对象里不可能有重复的方法,这里也就不可能有重复的方法
if(_listeners[funcname]==undefined){
var func:Function=this._listener[funcname];
var returnFunc:Function=function(evt:KeyboardEvent){
if(evt.keyCode==key){
func.apply(this,args)
}
};
this._listeners[funcname]=returnFunc
}
return this._listeners[funcname];
}
}
}

然后就是使用它了.

var keyDectecter:KKeyboard=new KKeyboard(this);
keyDectecter.registerKeyDownEvent(Keyboard.ENTER,"doLogin");
.....

function doLogin(evt:Event=null)
{
//当按下ENTER键的时候,就执行这里的事...
//执行完了,再取消侦听吧
keyDectecter.unregisterKeyDownEvent(Keyboard.ENTER,"doLogin");
}

与原来的代码相比较,这个类的功能更偏向于对于单键的特殊处理,比如刚刚这个ENTER之后做登录操作这种的.也让程序更便于阅读.
上边执行的代码类似于
this.root.stage.addEventListener(KeyboardEvent.KEY_DOWN,doLogin)
....
function doLogin(evt:KeyboardEvent)
{
if(evt.keyCode==Keyboard.ENTER){
//doLogin的具体操作
}
}

倘若你想做的事是类似按下某个键,角色四向移动这种的.那建议还是使用传统的方式吧.用我这个方式你得定义四个不同的处理方法来应对上下左右.

 

 

 

 

FLASH课件制作培训班开班了!火热报名中!加我站管理QQ444860709解决任何疑问! 培训QQ专业群67042004。